/*
 * Threader.h
 *
 *  Created on: 03/10/2011
 *      Author: guido
 */

#ifndef THREADER_H_
#define THREADER_H_

#include "runnable.h"
#include <list>
#include <iterator>

class Threader {
private:
	std::list<Thread*> threads;
public:

	Threader() {
	}
	~Threader() {
		while (!threads.empty()) {
			Thread* temp = threads.front();
			threads.pop_front();
			delete temp;
		}
	}
	/* La funcion recibe en el primer parametro una funcion que debe llamar
	 * al run de arg. Conviene crear un metodo estatico en la clase y crear
	 * clases que deriven de Runnable para que sean como metodos
	 */
	void crearThread(Runnable* arg) {
		Thread* thread = new Thread(arg);
		threads.push_front(thread);
		thread->start();
	}

	void limpiarThreads() {
		std::list<Thread*>::iterator it = threads.begin();
		while (	it != threads.end()) {
			if (!((*it)->isAlive())) {
				Thread* temp = *it;
				threads.erase(it++);
				delete temp;
			}
			else {
				++it;
			}
		}
	}
};

#endif /* THREADER_H_ */
